<!DOCTYPE html>


<html lang="zn-CH">


<head>
  <meta charset="utf-8" />
    
  <meta name="description" content="What I can do is to Do My Personal Best!" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
    IEDA+DOCLever操作说明 |  小熊的博客
  </title>
  <meta name="generator" content="hexo-theme-yilia-plus">
  
  <link rel="shortcut icon" href="http://www.cdn.adingxiong.com/b5363a06dc744d79a94021492bcefe27" />
  
  
<link rel="stylesheet" href="/blog/dist/main.css">

  
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Shen-Yu/cdn/css/remixicon.min.css">

  
<link rel="stylesheet" href="/blog/css/custom.css">

  
  
<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>

  
  

  

<link rel="alternate" href="/blog/atom.xml" title="小熊的博客" type="application/atom+xml">
</head>

</html>

<body>
  <div id="app">
    <main class="content on">
      <section class="outer">
  <article id="post-IEDA使用说明" class="article article-type-post" itemscope
  itemprop="blogPost" data-scroll-reveal>

  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  IEDA+DOCLever操作说明
</h1>
 

    </header>
    

    
    <div class="article-meta">
      <a href="/blog/2019/01/09/IEDA%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/" class="article-date">
  <time datetime="2019-01-09T09:04:00.000Z" itemprop="datePublished">2019-01-09</time>
</a>
      
  <div class="article-category">
    <a class="article-category-link" href="/blog/categories/IDEA/">IDEA</a>
  </div>

      
      
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> Word count:</span>
            <span class="post-count">3.1k</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> Reading time≈</span>
            <span class="post-count">11 min</span>
        </span>
    </span>
</div>

      
    </div>
    

    
    
    <div class="tocbot"></div>





    

    
    <div class="article-entry" itemprop="articleBody">
      
      

      
      <h1 id="IEDA-DOCLever操作说明"><a href="#IEDA-DOCLever操作说明" class="headerlink" title="IEDA+DOCLever操作说明"></a>IEDA+DOCLever操作说明</h1><h2 id="一、IEDA下载安装"><a href="#一、IEDA下载安装" class="headerlink" title="一、IEDA下载安装"></a>一、IEDA下载安装</h2><ul>
<li>下载地址: <a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noopener">https://www.jetbrains.com/idea/download/</a></li>
<li>激活码： <a href="http://idea.lanyus.com/" target="_blank" rel="noopener">http://idea.lanyus.com/</a></li>
</ul>
<h2 id="二、IEDA的使用"><a href="#二、IEDA的使用" class="headerlink" title="二、IEDA的使用"></a>二、IEDA的使用</h2><h3 id="1-界面"><a href="#1-界面" class="headerlink" title="1.界面"></a>1.界面</h3><p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108150312.png" alt="IDEA"></p>
<h3 id="2-项目准备阶段"><a href="#2-项目准备阶段" class="headerlink" title="2.项目准备阶段"></a>2.项目准备阶段</h3><h4 id="2-1环境依赖"><a href="#2-1环境依赖" class="headerlink" title="2.1环境依赖"></a>2.1环境依赖</h4><p>1.maven选择的是3.5.0版本以上的，具体的配置过程如下：</p>
<ul>
<li>单击IDEA状态栏的file-&gt;setting-&gt; 直接在搜索框输入maven，如下图所示</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108142914.png" alt="maven"></p>
<ul>
<li>在Maven home directory里面写上你所下载的maven的路径,User setting file是maven下载包中conf下的setting.xml文件，具体的配置如下<blockquote>
<p><code>&lt;localRepository&gt;E:\maven\mavenFactory&lt;/localRepository&gt;</code></p>
</blockquote>
</li>
</ul>
<p>localRepository是本地依赖下载存储的位置,</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&lt;mirrors&gt;</span><br><span class="line">     &lt;mirror&gt;   </span><br><span class="line">         &lt;id&gt;discussGroup&lt;&#x2F;id&gt;   </span><br><span class="line">     &lt;mirrorOf&gt;*&lt;&#x2F;mirrorOf&gt;   </span><br><span class="line">    &lt;url&gt;http:&#x2F;&#x2F;118.112.188.108:9289&#x2F;nexus&#x2F;content&#x2F;groups&#x2F;discussGroup&#x2F;&lt;&#x2F;url&gt;</span><br><span class="line"> &lt;&#x2F;mirror&gt;</span><br></pre></td></tr></table></figure>
<ul>
<li><p>mrrors 是仓库地址镜像设置</p>
</li>
<li><p>这几个设置完成之后，可能会提醒你更新项目的依赖包，这个时候可以先忽略调</p>
</li>
</ul>
<pre><code>2.JDK1.8 ,这里使用的jdk版本必须是1.8以上

3.银海插件的使用</code></pre><ul>
<li>同理，还是进入到set界面，找到Plugins界面，在搜索框搜到银海插件,如果有的话可以从本地导入该插件，如下图：<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108150724.png" alt><br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108164108.png" alt><br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108164156.png" alt></li>
</ul>
<p>找到本地插件的位置</p>
<h3 id="3-项目构建"><a href="#3-项目构建" class="headerlink" title="3. 项目构建"></a>3. 项目构建</h3><ul>
<li>在构建项目之前，先指定一个位置作为IDAE的工作控件，作为项目的存储位置</li>
</ul>
<h4 id="一-新建父项目"><a href="#一-新建父项目" class="headerlink" title="一. 新建父项目"></a>一. 新建父项目</h4><ol>
<li>依次点击File-&gt;Nem-&gt;Project,左侧选择Maven,不要勾选Create from archetype选项）,如下图，点击next<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108151436.png" alt></li>
</ol>
<p>依次补齐剩下的步骤<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108151728.png" alt></p>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108151807.png" alt></p>
<p>要注意的是在点finish之前看一下项目的路径，放在自己预设的项目工作空间</p>
<p><strong>需要注意的是，所有的文件夹都不能使用中文</strong></p>
<h4 id="二-新建框架模块"><a href="#二-新建框架模块" class="headerlink" title="二. 新建框架模块"></a>二. 新建框架模块</h4><p>在父项目下,选择新建模块,Spring Initializr,选中Custom输入如下地址：<a href="http://192.168.17.18:8080/cloud/" target="_blank" rel="noopener">http://192.168.17.18:8080/cloud/</a> 或者<a href="http://118.112.188.108:9289/cloud/" target="_blank" rel="noopener">http://118.112.188.108:9289/cloud/</a> 然后点next.<br> <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108152310.png" alt></p>
<p> <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108152438.png" alt></p>
<p> <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108152607.png" alt></p>
<p> 补全包项目的信息，然后点击next界面，这里会有需要用到的依赖选择</p>
<h4 id="三-、功能模块的选择"><a href="#三-、功能模块的选择" class="headerlink" title="三 、功能模块的选择"></a>三 、功能模块的选择</h4><ul>
<li>核心模块全选</li>
<li>组织机构全选</li>
<li>持久化框架选mybatis</li>
<li>缓存类型选ehcache</li>
<li>服务注册选zookeeper</li>
<li>集群同步选cluster</li>
<li>验证码选中</li>
<li>分布式事务不选</li>
<li>字典选中<blockquote>
<p>   如下所示:</p>
</blockquote>
</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108153042.png" alt><br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108153102.png" alt></p>
<h4 id="四-、完成项目创建"><a href="#四-、完成项目创建" class="headerlink" title="四 、完成项目创建"></a>四 、完成项目创建</h4><p>后面按照默认操作，不需要更改，项目创建完成之后，可能会出现报错，这个是犹豫缺少依赖，这个时候，进入maven里面，因为每次都会恢复到默认，需要手动勾选maven配置，然后回到主项目上点右键。<br>   <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108153529.png" alt></p>
<p>项目重新构建，这个时候，会自动下载相关需要用到的依赖。     </p>
<blockquote>
<p> 需要注意的一点是，在父模型的pom.xml文件中，需要导入子模型</p>
</blockquote>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108153825.png" alt></p>
<p><strong>在这里创建的smartmodule即为子模块，项目的小模块开发，大部分的已经开发完成</strong></p>
<hr>
<p> 完成maven更新的时候，如果还是出现依赖错误的情况，我们可以先注释掉不需要的依赖</p>
<pre><code>&lt;artifactId&gt;ta404-component-cachemg&lt;/artifactId&gt;
&lt;artifactId&gt;ta404-component-logmg&lt;/artifactId&gt;  
&lt;artifactId&gt;ta404-module-cluster&lt;/artifactId&gt;
&lt;artifactId&gt;ta404-module-registry-zookeeper&lt;/artifactId&gt;</code></pre><p><strong>在application.yml配置中，讲集群和控制中心都改成false，暂且不开启，在上一步骤中事先已经将相关依赖注释掉了</strong></p>
<p><img src="https://raw.githubusercontent.com/supbadboy/image/master/20190228114305.png" alt></p>
<ul>
<li>到这里项目构建基本完成</li>
</ul>
<h4 id="五-、编写一个完成的业务"><a href="#五-、编写一个完成的业务" class="headerlink" title="五 、编写一个完成的业务"></a>五 、编写一个完成的业务</h4><p>1.准备好数据库连接</p>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108155406.png" alt>  </p>
<p>2.这里是选择使用oracle，然后进入到DataSource界面</p>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108162413.png" alt></p>
<p>3.填写你需要连接的数据库，输入完成之后，点击test connection测试是否能够连接<br>    可能会出现的是，没有此按钮在，这说明你没有安装oracle插件，点击driver旁边插件自动下载，下载完成测试是否完成。<br> <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108163050.png" alt></p>
<p>4.完成之后你就可以看到数据库里面的数据表</p>
<p>5.使用银海插件工具，进行代码自动生成<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108164409.png" alt></p>
<p>6.在数据库表中，选择任意一个表，右键表名-&gt;代码生成工具-&gt;代码生成<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108164853.png" alt></p>
<p>7.第一次生成的时候出了.xml和.json不勾选，其它都选中，然后勾选禁止提示，这个时候它会自动在test下面自动创建相关文件<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108165458.png" alt> </p>
<p>8.检查每个文件夹下创建的类是否有问题，或者是有缺失，如果有缺少的话，单独选择重新创建。</p>
<p>9.mapper映射文件的自动生成，重新进入代码生成界面，其他路径不改，path路径是选择src/main/resources/mapper，然后选择readMapper.xml和writeMapper.xml自动生成sql映射文件。<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108165937.png" alt></p>
<p>10.代码生成完成之后，在application-DataSource.yml中完成相关包的扫码<br><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108170146.png" alt></p>
<h2 id="4-工程配置说明"><a href="#4-工程配置说明" class="headerlink" title="4. 工程配置说明"></a>4. 工程配置说明</h2><h3 id="4-1-配置文件加载顺序"><a href="#4-1-配置文件加载顺序" class="headerlink" title="4.1 配置文件加载顺序"></a>4.1 配置文件加载顺序</h3><pre><code>bootstrap.yml &gt; application.yml &gt; application-*.yaml 如果存在相同的属性,先加载的生效application-datasource.yaml中添加了mybatis的扫描,会加载mapper.xml文件</code></pre><h3 id="4-2-详细配置说明"><a href="#4-2-详细配置说明" class="headerlink" title="4.2 详细配置说明"></a>4.2 详细配置说明</h3><pre><code>了解项目包路径</code></pre><p> <img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108160007.png" alt></p>
<pre><code>1.bootstrap.yml</code></pre><ul>
<li>Server.port为项目启动端口号  设置成8081</li>
<li>Server.servlet.session.timeout为session失效时间  默认不变</li>
<li>context-path: /git  全局上下文  这里看情况而定，这里如果加了上下文，后面的所有的访问路径都需要拼接上/git    </li>
</ul>
<blockquote>
<p>2.application.yml</p>
</blockquote>
<ul>
<li>ta404.log日志输出配置</li>
<li>Ta404.profiles.active 额外加载的配置文件,配置x时,会去自动加载application-x.yaml文件</li>
<li>Ta404.validation.customRegex自定义验证规则</li>
<li>Ta404.modules.security安全相关配置</li>
<li>Ta404.modules.security .permitUrls 无需登录即可访问地址</li>
<li>Ta404.modules.security .loginPermitUrls 登陆之后所有角色都可访问地址</li>
</ul>
<blockquote>
<ol start="3">
<li>application-datasource.yml</li>
</ol>
</blockquote>
<ul>
<li>Ta404.database.transaction.packageStartCheck事务扫描目录</li>
<li>Ta404.database.mybatis.page-dialect分页组件方言</li>
<li>Ta404.database.mybatis.datasourceList启用数据源</li>
<li>Ta404.database.mybatis.ta404ds框架数据源相关配置</li>
<li>Ta404.database.mybatis.ta404ds.mapper框架mapper接口扫描路径</li>
<li>Ta404.database.mybatis.ta404ds. type-aliases-package实体类扫描路径</li>
<li>Ta404.database.mybatis.ta404ds. mapper-locations框架mapper.xml扫描路径</li>
</ul>
<h3 id="4-3-数据库的配置修改"><a href="#4-3-数据库的配置修改" class="headerlink" title="4.3 数据库的配置修改"></a>4.3 数据库的配置修改</h3><p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108161449.png" alt></p>
<h3 id="4-4-尝试后台项目启动"><a href="#4-4-尝试后台项目启动" class="headerlink" title="4.4 尝试后台项目启动"></a>4.4 尝试后台项目启动</h3><ul>
<li>创建快捷启动</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108170432.png" alt></p>
<ul>
<li>当点击debug调试启动，正常启动会显示码表开始加载   码表加载完成，正常启动没有显示错误即为后端部署完成。</li>
<li>如果出现异常，具体问题具体分析，可能会忘记扫描自己写的包，会出现问题</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108173637.png" alt></p>
<ul>
<li>此时可以进入下一个环境，自己写一个增删改查的后端业务，然后在DOCLever工具上进行接口测试。</li>
</ul>
<ul>
<li>一般后台的业务是写在rest里面<blockquote>
<p>比如我需要写一个插入数据的业务，在test包下面的rest包TatestRestService中</p>
</blockquote>
</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108191423.png" alt></p>
<hr>
<hr>
<h1 id="DOClever-工具类"><a href="#DOClever-工具类" class="headerlink" title="DOClever 工具类"></a>DOClever 工具类</h1><ul>
<li>DOClever是一个可视化免费开源的接口管理工具 ,可以分析接口结构，校验接口正确性， 围绕接口定义文档，通过一系列自动化工具提升我们的协作效率。DOClever前后端全部采用了javascript来作为我们的开发语言，前端用的是vue+element UI，后端是express+mongodb，这样的框架集成了高并发，迭代快的特点，保证系统的稳定可靠。</li>
<li>mock 的无缝整合，DOClever 自己就是一个 mock 服务器，当你把接口的开发状态设置成已完成，本地 mock 便会自动请求真实接口数据，否则返回事先定义好的 mock 数据。</li>
</ul>
<h2 id="DOCLever-的使用"><a href="#DOCLever-的使用" class="headerlink" title="DOCLever 的使用"></a>DOCLever 的使用</h2><ul>
<li>注册使用</li>
<li>DOclever 作为接口管理工具，一般只需创建一个团队，然后在邀请成员进行协同开发测试</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108174131.png" alt></p>
<ul>
<li>创建团队成功之后，邀请组员加入，并给组员相应的权限，然后每个人都可以新建接口测试</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108174649.png" alt></p>
<ul>
<li>点击<code>+</code>号即可以新建接口，名称中英文都可以，简介可以不用填，状态写开发中，请求路径设置为POST，接口名称在后端restService中找，如下图：</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108175121.png" alt></p>
<ul>
<li>将上图的箭头所指的地方拼接起来，就是接口的路径。前面加斜线表示绝对路径</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108175213.png" alt></p>
<ul>
<li>在参数里面body中输入接口中所需要的参数，比如我调用的接口是selectOne，该接口是通过name模糊查询表中的所有数据</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108175706.png" alt></p>
<ul>
<li>在这里测试后端/tadict/tadictRestService!selectOne.do这个接口，看看接口是否有问题，因为测试是后端的接口，没有通过前端，保存上面的创建的接口，保存之后点击允许，<strong>接口路径选择POST， BaseUrl选择MockServer,然后点运行，即可调用后台方法，查询到数据库中的数据，显示在下面的result里面，需要注意的是，我们使用的是内网开发，所以需要打开DOclever右上角中的代理</strong></li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108180251.png" alt></p>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190108180310.png" alt></p>
<p>当状态代码显示的200的时候，即为接口正确无误，此时可以把Result里面的PreView里面的结果复制出来，返回上一步，找到result下面的导入json，<strong>需要注意的是，导入json时，犹豫上面查询的结果里面多了横线，所以我们要把之前的横线都删掉，然后再点确定</strong> 效果如下</p>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109090612.png" alt></p>
<p>此时DOCLever会将查询出来的结果显示在Result里面，呈json格式显示出来。</p>
<h2 id="前后端交互设计"><a href="#前后端交互设计" class="headerlink" title="前后端交互设计"></a>前后端交互设计</h2><pre><code>前后端分离的原理：后台不再空置页面跳转，前台只发起POST请求，后端只返回json数据</code></pre><h3 id="交互流程"><a href="#交互流程" class="headerlink" title="交互流程"></a>交互流程</h3><p> 一 、dev-mock(前台-Doclever-后台)</p>
<ul>
<li>前台使用 npm run dev-mock 启动</li>
<li>前台发起一个请求,请求被代理到doclever,如果接口不存在或者接口已完成,则跳转到实际后台地址进行访问</li>
<li>前台发起一个请求,请求被代理到doclever,如果接口是开发中,则直接返回mock数据。</li>
</ul>
<p>二 、dev（前端-后端）启动</p>
<ul>
<li>修改faceConfig.js中的basePath为后台地址,前台使用npm run dev 启动</li>
<li>前台发起一个请求,请求直接放问后台实际地址进行访问</li>
</ul>
<p>三  、请求地址配置说明</p>
<ul>
<li>后台端口,在后端bootstrap.yml中的sever.port中定义</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109094159.png" alt></p>
<ul>
<li>前台端口,在前端config目录下的index.js中的,module.exports下的port中定义</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109094311.png" alt></p>
<ul>
<li>mock地址,在前端faceConfig.js中的faceConfig下的mockServer中定义<blockquote>
<p>  mock地址在DOCLever设置中，如下图所示：</p>
</blockquote>
</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109094056.png" alt></p>
<ul>
<li>实际后台地址,在前端faceConfig.js中的devServer中定义</li>
</ul>
<p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109094533.png" alt></p>
<h3 id="前后端交互的原理"><a href="#前后端交互的原理" class="headerlink" title="前后端交互的原理"></a>前后端交互的原理</h3><pre><code>在前端和后端都运行的时候，浏览器输入前端访问地址：http://127.0.0.1:8080, 此时前台的请求会直接转发到mockServer代理上，然后会在DOCLever上查找改接口是否存在或者是否开发完成，如果正在开发，此时前端的空置台会输出，接口正在开发中，返回mock数据，如果接口开发完成，会直接跳转到后端实际的地址进行访问。</code></pre><p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109100024.png" alt></p>
<pre><code>此时浏览器上，当点击登录的时候，前台发起请求：http://127.0.0.1:8080/login.html ,此时前台输出为：</code></pre><p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109100541.png" alt></p>
<pre><code>如果此时，我在DOCLever上将接口login.do改成开发中，这个时候控制台中会显示：</code></pre><p><img src="http://pkzuokcq8.bkt.clouddn.com/myfile/20190109100916.png" alt></p>
<h3 id="交互原理"><a href="#交互原理" class="headerlink" title="交互原理"></a>交互原理</h3><pre><code>主要是RestService的处理,需要继承BaseRestService.
    1.接口前台数据

        //a.通过变量接收
        public void deleteBatchUserByUserIds(String userIds)
        //b.通过对象接收,如果对象中的字段名称匹配成功,则会直接将属性注入
        public void queryBatchUserByOrgId(TaUserOrgKey taUserOrgKey, PageParam pageParam)
        //c.从request中获取
        String checkCode = (String) request.getParameter(&quot;checkCode&quot;);

    2.返回结果

        返回数据推荐使用框架封装的ResultBean对象,在restservice中步骤如下:
        //a.方法返回类型为void
        public void getConfig(HttpServletRequest request)
        //b.设置数据setData
        setData(&quot;configMap&quot;,configMap);
        //c.设置异常
        setError(&quot;原始密码错误&quot;, &quot;error&quot;);
        setSuccess(false);</code></pre><h4 id="前端交互"><a href="#前端交互" class="headerlink" title="前端交互"></a>前端交互</h4><pre><code>请求统一要求使用this.Base.submit,具体写法如下：
    let submitParam = {
        url:&quot;&quot;,  后端的实际访问地址
        data:&quot;&quot;,    提交参数
        method:&quot;&quot;,  提交方式
        autoValid:  ,   提交前的自动验证   
    };
    let callBack = {
        successCallBack:(data) =&gt; {
            请求成功的回调函数
        },
        failCallBack:(data) =&gt; {
            请求失败的回调函数
        }
    }
    this.Base.submit(自动验证,submitParam,callBack);</code></pre>
      
      <!-- reward -->
      
      <div id="reward-btn">
        Donate
      </div>
      
    </div>
    
    
      <!-- copyright -->
      
        <div class="declare">
          <ul class="post-copyright">
            <li>
              <i class="ri-copyright-line"></i>
              <strong>Copyright： </strong>
              Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
            </li>
          </ul>
        </div>
        
    <footer class="article-footer">
      
          
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=https://bodboy.gitee.io/blog/2019/01/09/IEDA%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/blog/tags/IDEA/" rel="tag">IDEA</a></li></ul>


    </footer>

  </div>

  
  
  <nav class="article-nav">
    
      <a href="/blog/2019/02/22/%E5%A6%82%E4%BD%95%E4%B8%8A%E4%BC%A0%E9%A1%B9%E7%9B%AE%E5%88%B0GitHub/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            如何上传项目到GitHub
          
        </div>
      </a>
    
    
      <a href="/blog/2018/12/25/vue-standard/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">vue 开发规范</div>
      </a>
    
  </nav>


  

  
  
<!-- valine评论 -->
<div id="vcomments-box">
    <div id="vcomments">
    </div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src='https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>
<script>
    new Valine({
        el: '#vcomments',
        app_id: 'uW8QYGvvhWmNWdiwpznJ0GVa-gzGzoHsz',
        app_key: 'LrJhMzx9qEwcMV1DJjTI6f6C',
        path: window.location.pathname,
        notify: 'false',
        verify: 'false',
        avatar: '[object Object]',
        placeholder: '给我的文章加点评论吧~',
        recordIP: true
    });
    const infoEle = document.querySelector('#vcomments .info');
    if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
        infoEle.childNodes.forEach(function (item) {
            item.parentNode.removeChild(item);
        });
    }
</script>
<style>
    #vcomments-box {
        padding: 5px 30px;
    }

    @media screen and (max-width: 800px) {
        #vcomments-box {
            padding: 5px 0px;
        }
    }

    #vcomments-box #vcomments {
        background-color: #fff;
    }

    .v .vlist .vcard .vh {
        padding-right: 20px;
    }

    .v .vlist .vcard {
        padding-left: 10px;
    }
</style>

  

  
  
  
  
  

</article>
</section>
      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2019-2021
        <i class="ri-heart-fill heart_icon"></i> panda
      </li>
    </ul>
    <ul>
      <li>
        
        
        
        Powered by <a href="https://hexo.io" target="_blank">Hexo</a>
        <span class="division">|</span>
        Theme - <a href="https://github.com/Shen-Yu/hexo-theme-ayer" target="_blank">Ayer</a>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>Visitors:<span id="busuanzi_value_site_uv"></span></s>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>Views:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>
      <div class="float_btns">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

      </div>
    </main>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/blog/"><img src="https://portrait.gitee.com/uploads/avatars/user/1007/3023420_bodboy_1578973210.png!avatar200" alt="小熊的博客"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/tags/%E6%97%85%E8%A1%8C/">旅行</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/blog/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <script>
      if (window.matchMedia("(max-width: 768px)").matches) {
        document.querySelector('.content').classList.remove('on');
        document.querySelector('.sidebar').classList.remove('on');
      }
    </script>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/blog/images/alipay.jpg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/blog/images/wechat.jpg">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/blog/js/jquery-2.0.3.min.js"></script>


<script src="/blog/js/lazyload.min.js"></script>


<script>
  try {
    var typed = new Typed("#subtitle", {
      strings: ['面朝大海，春暖花开', '愿你一生努力，一生被爱', '想要的都拥有，得不到的都释怀'],
      startDelay: 0,
      typeSpeed: 200,
      loop: true,
      backSpeed: 100,
      showCursor: true
    });
  } catch (err) {
  }

</script>




<script src="/blog/js/tocbot.min.js"></script>

<script>
  // Tocbot_v4.7.0  http://tscanlin.github.io/tocbot/
  tocbot.init({
    tocSelector: '.tocbot',
    contentSelector: '.article-entry',
    headingSelector: 'h1, h2, h3, h4, h5, h6',
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer: 'main',
    positionFixedSelector: '.tocbot',
    positionFixedClass: 'is-position-fixed',
    fixedSidebarOffset: 'auto'
  });
</script>



<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">
<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js"></script>

<script src="/blog/dist/main.js"></script>



<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>


<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
      tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
  });

  MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for(i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
      }
  });
</script>

<script src="https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script>
  var ayerConfig = {
    mathjax: true
  }
</script>




<script src="/blog/js/busuanzi-2.3.pure.min.js"></script>



<script type="text/javascript" src="https://js.users.51.la/20544303.js"></script>

  
<script src="/blog/js/clickLove.js"></script>



<!-- 复制 -->



    
    <div id="music">
    
    
    
    <iframe frameborder="no" border="1" marginwidth="0" marginheight="0" width="200" height="52"
        src="//music.163.com/outchain/player?type=2&id=1297802566&auto=1&height=32"></iframe>
</div>

<style>
    #music {
        position: fixed;
        right: 15px;
        bottom: 0;
        z-index: 998;
    }
</style>
    
  </div>
</body>

</html>